package com.example.demo.service;

import com.example.demo.domain.security.Token;
import com.example.demo.entity.AdminPermission;
import com.example.demo.entity.AdminRole;
import com.example.demo.entity.AdminUser;

import java.util.List;

/**
 * 管理员用户服务层接口
 *
 * @author 叮当猫的百宝箱
 * @since 1.0
 */
public interface AdminUserService {


    /**
     * 获取全部的管理员用户信息
     *
     * @return 管理员用户信息列表
     * @deprecated
     */
    List<AdminUser> getAllAdminUser();

    /**
     * 根据管理员ID获取管理员信息
     *
     * @param adminUserId 管理员用户ID
     * @return 管理员用户信息
     */
    AdminUser getAdminUserById(Long adminUserId);

    /**
     * 根据管理员用户名获取管理员信息
     *
     * @param username 管理员用户名
     * @return 管理员用户信息
     */
    AdminUser getAdminUserByUsername(String username);


    /**
     * 根据管理员ID获取管理员拥有哪些角色
     *
     * @param adminUserId 管理员用户ID
     * @return 管理员拥有的角色列表
     */
    List<AdminRole> getAdminRolesById(Long adminUserId);


    /**
     * 根据管理员ID获取管理员拥有哪些权限
     *
     * @param adminUserId 管理员用户ID
     * @return 管理员拥有的角色列表(去重)
     */
    List<AdminPermission> getAdminPermissionsById(Long adminUserId);

    /**
     * 根据管理员ID重置管理员密码
     *
     * @param adminUserid 管理员用户ID
     * @param password    管理员密码
     */
    void resetPasswordById(Long adminUserid, String password);

    /**
     * 根据管理员用户ID修改密码
     *
     * @param adminUserId      管理员用户ID
     * @param originalPassword 原始密码
     * @param newPassword      新密码
     */
    void updatePasswordById(Long adminUserId, String originalPassword, String newPassword);


    /**
     * 更新管理员角色信息
     *
     * @param adminUserId  管理员用户ID
     * @param adminRoleIds 管理员角色ID列表
     */
    void updateAdminUserRoles(Long adminUserId, List<Long> adminRoleIds);


    /**
     * 添加一个管理员用户
     *
     * @param adminUser 待添加的管理员用户
     */
    void createAdminUser(AdminUser adminUser);

    /**
     * 添加一个管理员用户
     * @param adminUser 待添加的管理员用户
     * @param ipAddress 操作时的IP地址
     */
    void createAdminUser(AdminUser adminUser, String ipAddress);

    /**
     * 通过管理员用户名和密码得到Token
     *
     * @param username 管理员用户名
     * @param password 管理员密码
     * @return 授权Token字符串
     */
    Token getToken(String username, String password);

    /**
     * 通过管理员用户名和密码得到Token
     *
     * @param username  管理员用户名
     * @param password  管理员密码
     * @param ipAddress 登陆时的IP
     * @return 授权Token字符串
     */
    Token getToken(String username, String password, String ipAddress);

    /**
     * 管理管理员用户ID 删除管理员用户信息
     *
     * @param adminUserId 管理员用户ID
     */
    void deleteAdminUserById(Long adminUserId);

    /**
     * 刷新token
     *
     * <pre>
     * 需要刷新token的情况如下：
     * 1. 当原token信息将要过期时, 需要刷新token防止客户端操作时候突然退出登陆
     * 2. 由于用户权限直接保存在token中,当用户的权限或者角色发生变动时需要刷新token，这样就不用重新登陆更新权限了
     * </pre>
     *
     * @return 新的token字符串
     */
    Token refreshToken();
}
